# db = pymysql.connect(user='root',password='123456',host='8.148.229.201',database='jiac',cursorclass =
# pymysql.cursors.DictCursor)
# 封装
import pymysql
import traceback        # 打印错误的堆栈信息到控制台，提醒程序员使用的

class DB:
    def __init__(self,user,password,database,host):
        self.user= user
        self.password = password
        self.database = database
        self.host = host
        """
        user：账号
        password：密码
        database：数据库名称
        host：ip地址
        """
    def connect(self):
        # 创建db对象
        self.db = pymysql.connect(user=self.user,password=self.password,host=self.host,database=self.database,cursorclass=pymysql.cursors.DictCursor)
        # 创建游标
        self.cursor = self.db.cursor()
    def close(self):
        # 先关闭游标
        self.cursor.close()
        # 再关闭数据库对象
        self.db.close()
    def selectOne(self,sql):
        # 定义一下，如果为空，就返回None
        result = None
        # 先去做连接数据库
        self.connect()
        try:
            self.cursor.execute(sql)
            result = self.cursor.fetchone()
            return result
        except:
            # 回滚，报错回滚
            self.db.rollback()
            traceback.print_exc()
            return result
        # 最后用完记得关闭数据库
        finally:
            self.close()

    def selectAll(self,sql):
        # 定义一下，如果为空，就返回None
        result = None
        # 先去做连接数据库
        self.connect()
        try:
            self.cursor.execute(sql)
            result = self.cursor.fetchall()
            return result
        except:
            # 回滚，报错回滚
            self.db.rollback()
            traceback.print_exc()
            return result
        # 最后用完记得关闭数据库
        finally:
            self.close()
    # 封装主程序函数
    def __edit(self,sql):
        result = None
        # 先去连接数据库
        self.connect()
        try:
            self.cursor.execute(sql)
            self.db.commit()        # 对数据库发生真实改变的，需要用到数据库去提交
            result = 1
            return result
        except:
            # 如果报错的话，先回滚数据库
            self.db.rollback()
            # 打印错误的堆栈信息到控制台
            traceback.print_exc()
            return result
        finally:
            self.close()

    # 调用主函数，进行新增
    def insert(self,sql):
        return self.__edit(sql)

    def update(self,sql):
        return self.__edit(sql)

    def delete(self,sql):
        return self.__edit(sql)


# 创建对象，测试一下
if __name__ == '__main__':
    d1 = DB(user='root',password='123456',database='jiac',host='8.148.229.201')
    # 调用查询方法：多条
    print(d1.selectAll('select * from student'))
    # 调用查询方法：单条
    print(d1.selectOne('select * from student'))
    # 调用新增方法
    # print(d1.insert('insert into student(name,address) values("wangq","辽宁")'))



















